wayland: implementation of pointer_handle_axis.
authorJosé Dapena Paz <jdapena@igalia.com>
Fri, 13 Jul 2012 14:29:25 +0000 (16:29 +0200)
committerRob Bradford <rob@linux.intel.com>
Mon, 16 Jul 2012 14:37:53 +0000 (15:37 +0100)
We translate wayland pointer axis events to GDK smooth scroll events, to
implement pointer_handle_axis events.

https://bugzilla.gnome.org/show_bug.cgi?id=679986
Signed-off-by: Rob Bradford <rob@linux.intel.com>
gdk/wayland/gdkdevice-wayland.c

index 82ddb25abc334eda79967343d361e8ad64f22c82..f1698b3996f686209f8b4a187a311747b5027ee6 100644 (file)
@@ -1112,6 +1112,41 @@ pointer_handle_axis (void              *data,
                      uint32_t           axis,
                      wl_fixed_t         value)
 {
+  GdkWaylandDevice *device = data;
+  GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display);
+  GdkEvent *event;
+  gdouble delta_x, delta_y;
+
+  switch (axis) {
+  case WL_POINTER_AXIS_VERTICAL_SCROLL:
+    delta_x = 0;
+    delta_y = -wl_fixed_to_double (value);
+    break;
+  case WL_POINTER_AXIS_HORIZONTAL_SCROLL:
+    delta_x = -wl_fixed_to_double (value);
+    delta_y = 0;
+  default:
+    g_return_if_reached ();
+  }
+
+  device->time = time;
+  event = gdk_event_new (GDK_SCROLL);
+  event->scroll.window = g_object_ref (device->pointer_focus);
+  gdk_event_set_device (event, device->pointer);
+  event->scroll.time = time;
+  event->scroll.x = (gdouble) device->surface_x;
+  event->scroll.y = (gdouble) device->surface_y;
+  event->scroll.direction = GDK_SCROLL_SMOOTH;
+  event->scroll.delta_x = delta_x;
+  event->scroll.delta_y = delta_y;
+  event->button.state = device->modifiers;
+  gdk_event_set_screen (event, display->screen);
+
+  GDK_NOTE (EVENTS,
+            g_message ("scroll %f %f",
+                       event->scroll.delta_x, event->scroll.delta_y));
+
+  _gdk_wayland_display_deliver_event (device->display, event);
 }
 
 static void